<?php
/**
* 名称：路由类。
* 描述：负责tryPHP中寻址、创行控制器。
*/
final class Route{
    /**
    * 描述：字面量常值。
    */
    const PROTOCOL_COMMON='common';             //路由协议之“默认协议”字面量常值。
    const PROTOCOL_STATIC='static';             //路由协议之“静态协议”的字面量常值。
    const INDEX_NAME_APPLICATION='application'; //参数集合中，用于索引“应用”的字面量值。
    const INDEX_NAME_CONTROLLER='controller';   //参数集合中，用于索引“控制器”的字面量值。
    const INDEX_NAME_METHOD='method';           //参数集合中，用于索引“控制器操作标识”的字面量值。
    const INDEX_NAME_MODE='mode';               //参数集合中，用于索引“控制器运行模式”的字面量值。

    /**
    * 描述：配置选项内部标量。
    */
    private static $Protocol=NULL;                                       //协议。
    private static $DefaultApplication=NULL;                             //默认应用。
    private static $DefaultController=NULL;                              //默认控制器。
    private static $DefaultMode=NULL;                             //默认应用。
    private static $DefaultMethod=NULL;                              //默认控制器。
    private static $ProtocolOptionsCommonParametersNameApplication=NULL; //应用。
    private static $ProtocolOptionsCommonParametersNameController=NULL;  //控制器。
    private static $ProtocolOptionsCommonParametersNameMethod=NULL;      //方法。
    private static $ProtocolOptionsCommonParametersNameMode=NULL;        //模式。

    /**
    * 描述：是否己经解析参数。
    */
    private static $IsParse=FALSE;

    /**
    * 描述：请求参数的集合。
    */
    private static $Arguments=array(
        self::INDEX_NAME_APPLICATION=>NULL,
        self::INDEX_NAME_CONTROLLER=>NULL,
        self::INDEX_NAME_METHOD=>NULL,
        self::INDEX_NAME_MODE=>NULL
    );

    /**
    * 描述：根据协议采用不同的方法获取值，并构建Route实例。
    */
    private static function ParseArguments(){
        self::$Protocol=strtolower(TRYPHP_ROUTE_PROTOCOL);
        self::$DefaultApplication=TRYPHP_DEFAULT_APPLICATION;
        self::$DefaultController=TRYPHP_DEFAULT_CONTROLLER;
        self::$DefaultMode=TRYPHP_DEFAULT_MODE;
        self::$DefaultMethod=TRYPHP_DEFAULT_METHOD;
        self::$ProtocolOptionsCommonParametersNameApplication=TRYPHP_ROUTE_PROTOCOLOPTIONS_COMMON_PARAMETERNAME_APPLICATION;
        self::$ProtocolOptionsCommonParametersNameController=TRYPHP_ROUTE_PROTOCOLOPTIONS_COMMON_PARAMETERNAME_CONTROLLER;
        self::$ProtocolOptionsCommonParametersNameMethod=TRYPHP_ROUTE_PROTOCOLOPTIONS_COMMON_PARAMETERNAME_METHOD;
        self::$ProtocolOptionsCommonParametersNameMode=TRYPHP_ROUTE_PROTOCOLOPTIONS_COMMON_PARAMETERNAME_MODE;
        #开始解析，并标注为己经解析。
        if(self::$IsParse===TRUE){
           return;
        }
        #开始初始化处理。
        if(self::PROTOCOL_STATIC===self::$Protocol){
            #路径偏移处理，就是当ROOT和BUILD_ROOT值不相等，也就是TryPHP架构根路径和PHP构架路径不相等的情况。
            if(BUILD_PATH_OFFSET){
                $arguments=explode('/',str_replace(BUILD_PATH_OFFSET,'',$_SERVER['REQUEST_URI']));
            }
            else{
                $arguments=explode('/',$_SERVER['REQUEST_URI']);
            }
            #应用参数处理。
            if(isset($arguments[1])&&!empty($arguments[1])){
                self::$Arguments[self::INDEX_NAME_APPLICATION]=$arguments[1];
            }
            else{
                self::$Arguments[self::INDEX_NAME_APPLICATION]=self::$DefaultApplication;
            }
            #控制器及其模式参数处理。
            if(isset($arguments[2])&&!empty($arguments[2])){
                if(FALSE!==strpos($arguments[2],'?')){ //处理DWZ加上去的随机字符串。
                    $temp=explode('?',$arguments[2]);
                    $arguments[2]=$temp[0];
                }
                if(strpos($arguments[2],'-')===FALSE){ //获析参数，取得controll和mode的值。
                    self::$Arguments[self::INDEX_NAME_CONTROLLER]=$arguments[2];
                    self::$Arguments[self::INDEX_NAME_MODE]=Controller::MODE_CLASS;
                }
                else{
                    $temp=explode('-',$arguments[2]);
                    self::$Arguments[self::INDEX_NAME_CONTROLLER]=$temp[0];
                    if(empty($temp[1])){
                        self::$Arguments[self::INDEX_NAME_MODE]=Controller::MODE_CLASS;
                    }
                    else{
                        self::$Arguments[self::INDEX_NAME_MODE]=$temp[1];
                    }
                }
                #调用方法参数处理。
                if(isset($arguments[3])&&!empty($arguments[3])){
                    if(FALSE!==strpos($arguments[3],'&')){ //处理“&”符号的存在，“&”后面为无效字符。
                        $temp=explode('&',$arguments[3]);
                        $arguments[3]=$temp[0];
                    }
                    self::$Arguments[self::INDEX_NAME_METHOD]=$arguments[3];
                }
                else{
                    self::$Arguments[self::INDEX_NAME_METHOD]=NULL;
                }
            }
            else{
                self::$Arguments[self::INDEX_NAME_CONTROLLER]=self::$DefaultController;
                self::$Arguments[self::INDEX_NAME_MODE]=self::$DefaultMode;
                self::$Arguments[self::INDEX_NAME_METHOD]=self::$DefaultMethod;
            }

            #生成请求参数。
            $otherArguments=array_slice($arguments,4,count($arguments)-1);
            foreach($otherArguments as $key=>$value){
                if(strpos($value,'_')!==FALSE){
                    $temp=explode('_',$value);
                    $tempValue=$temp[count($temp)-1];
                    unset($temp[count($temp)-1]);
                    $tempKey=implode('_',$temp);
                    self::$Arguments[$tempKey]=$tempValue;
                }
                else{
                    self::$Arguments[$key]=$value;
                }
            }
        }
        else{
            $arguments=$_GET;
            if(count($_GET)===0&&$_SERVER['REQUEST_URI']!=='/'){
                return;
            }
            #应用参数处理。
            $applicationParameterName=self::$ProtocolOptionsCommonParametersNameApplication;
            if(isset($arguments[$applicationParameterName])&&!empty($arguments[$applicationParameterName])){
                self::$Arguments[self::INDEX_NAME_APPLICATION]=$_GET[$applicationParameterName];
                unset($arguments[$applicationParameterName]);
            }
            else{
                self::$Arguments[self::INDEX_NAME_APPLICATION]=self::$DefaultApplication;
            }
            #控制器参数处理。
            $controllerParameterName=self::$ProtocolOptionsCommonParametersNameController;
            if(isset($arguments[$controllerParameterName])&&!empty($arguments[$controllerParameterName])){
                self::$Arguments[self::INDEX_NAME_CONTROLLER]=$arguments[$controllerParameterName];
                unset($arguments[$controllerParameterName]);
                #控制器模式参数处理。
                $modeParameterName=self::$ProtocolOptionsCommonParametersNameMode;
                if(isset($arguments[$modeParameterName])&&!empty($arguments[$modeParameterName])){
                    self::$Arguments[self::INDEX_NAME_MODE]=$arguments[$modeParameterName];
                    unset($arguments[$modeParameterName]);
                }
                else{
                    self::$Arguments[self::INDEX_NAME_MODE]=Controller::MODE_CLASS;
                }
                #控制器操作标识符参数处理。
                $methodParameterName=self::$ProtocolOptionsCommonParametersNameMethod;
                if(isset($arguments[$methodParameterName])&&!empty($arguments[$methodParameterName])){
                    self::$Arguments[self::INDEX_NAME_METHOD]=$arguments[$methodParameterName];
                    unset($arguments[$methodParameterName]);
                }
            }
            else{
                self::$Arguments[self::INDEX_NAME_CONTROLLER]=self::$DefaultController;
                self::$Arguments[self::INDEX_NAME_MODE]=self::$DefaultMode;
                self::$Arguments[self::INDEX_NAME_METHOD]=self::$DefaultMethod;
            }
            #生成请求参数。
            foreach($arguments as $key=>$value){
                self::$Arguments[$key]=$value;
            }
        }
        self::$IsParse=TRUE;
    }

    /**
    * 描述：根据协议生成URL。
    */
    public static function GenerateURI_Function($application,$controller,$arguments=array()){
        $GLOBALS['____x']=array($application);
        $GLOBALS['____y']=array($controller);
        $GLOBALS['____z']=$arguments;
        function ____(){
            $newArray=array();
            foreach ($GLOBALS['____z'] as $key=>$value){
                $newArray[]=$key.':'.$value;
            }
            return array_merge($GLOBALS['____x'],$GLOBALS['____y'],$newArray);
        }
        return create_function('$parameters=array()','return call_user_func_array("Route::GenerateURI",array_merge(____(),array($parameters)));');
    }
    public static function GenerateURI(){
        #检测必须参数之”所在应用“。
        if(func_num_args()>1){
            $application=func_get_arg(0);
        }
        #检测必须参数之”所在控制器、方法、模式“。
        if(func_num_args()>1){
            $controller=func_get_arg(1);
        }
        #url参数
        $temp=func_get_args();
        $arguments=array_splice($temp,2);
        #生活全局必要参数。
        self::ParseArguments();
        #开始生成URL。
        $url=NULL;
        if(self::PROTOCOL_STATIC===self::$Protocol){
            //--
            if(!isset($application)||$application===''||$application==='__DEFAULT__'){
                $url.='/'.APP_NAME;
            }
            else{
                $url.='/'.$application;
            }
            $controller=explode(':',$controller);
            if(isset($controller[0])){
                if(strpos($controller[0],'-')!==FALSE){
                    $tempVar=explode('-',$controller[0]);
                    $url.='/'.$tempVar[0].'-'.$tempVar[1];
                }
                else{
                    $url.='/'.$controller[0];
                }
            }
            else{
                $url.='/'.self::$DefaultController;
            }
            //--method
            if(isset($controller[1])){
                $url.='/'.$controller[1];
            }
            //--
            foreach($arguments as $name=>$value){
                $temp=explode(':',$value);
                $url.=('/'.$temp[0].'_'.$temp[1]);
            }
            //--
            if(BUILD_PATH_OFFSET){
                $url=BUILD_PATH_OFFSET.$url;
            }
        }
        else{
            $url.='?';
            //--
            if(!isset($application)||$application===''||$application==='__DEFAULT__'){
                $url.=(self::$ProtocolOptionsCommonParametersNameApplication.'='.APP_NAME);
            }
            else{
                $url.=(self::$ProtocolOptionsCommonParametersNameApplication.'='.$application);
            }
            //--controller&mode
            $controller=explode(':',$controller);
            if(isset($controller[0])){
                if(strpos($controller[0],'-')!==FALSE){
                    $tempVar=explode('-',$controller[0]);
                    $url.=('&'.self::$ProtocolOptionsCommonParametersNameController.'='.$tempVar[0].'&'.self::$ProtocolOptionsCommonParametersNameMode.'='.$tempVar[1]);
                }
                else{
                    $url.=('&'.self::$ProtocolOptionsCommonParametersNameController.'='.$controller[0]);
                }
            }
            else{
                $url.=(self::$ProtocolOptionsCommonParametersNameController.'='.self::$DefaultController);
            }
            //--method
            if(isset($controller[1])){
                $url.=('&'.self::$ProtocolOptionsCommonParametersNameMethod.'='.$controller[1]);
            }
            //--
            foreach($arguments as $name=>$value){
                $temp=explode(':',$value);
                $url.=('&'.$temp[0].'='.$temp[1]);
            }
        }
        return $url;
    }

    /**
    * 描述：获取请求的参数值。
    */
    public static function GetArguments($name=NULL){
        self::ParseArguments();
        $result=NULL;
        if(is_null($name)){
            $result=self::$Arguments;
        }
        else{
            #处理callStatic调用。
            if('array'===gettype($name)){
                $name=$name[0];
            }
            #开始处理过程。
            if(array_key_exists($name,self::$Arguments)){
                $result=self::$Arguments[$name];
            }
        }
        return $result;
    }

    /**
    * 描述：根据路由协议生成指定格式超链接。
    * @access public
    * @return string
    */
    public static function MakeHyperlink(){
        //最低要求2个参数即应用和控制器。
        if(func_num_args()<1){
            return '__NULL__';
        }
        //获取应用名称。
        $application=self::MakeHyperlink_GetAppliation(func_get_args());
        //获取控制器和方法名。
        $temp=self::MakeHyperlink_GetControllerAndModeAndMethod(func_get_args());
        $controller=$temp['controller'];
        $mode=$temp['mode'];
        $method=$temp['method'];
        //获取参数。
        $parameters=self::MakeHyperlink_GetParameters(func_get_args());
        //获取修正参数。
        $parametersRevision=self::MakeHyperlink_GetParametersRevision(func_get_args());
        //生成链接。
        if(self::$Protocol===self::PROTOCOL_COMMON){
            return self::MakeHyperlink_ForCommon($application,$controller,$mode,$method,$parameters,$parametersRevision);
        }
        elseif(self::$Protocol===self::PROTOCOL_STATIC){
            return self::MakeHyperlink_ForStatic($application,$controller,$mode,$method,$parameters,$parametersRevision);
        }
        else{
            return '__NULL__';
        }
    }
    /*#*/
    public static function MakeHyperlinkCallback(){
        $GLOBALS['____x']=func_get_args();
        function _____($parameters){
            if(Route::MakeHyperlink_IsController($GLOBALS['____x'][0])){
                $GLOBALS['____x'][1].=('|'.$parameters);
            }
            else{
                $GLOBALS['____x'][2].=('|'.$parameters);
            }
            return $GLOBALS['____x'];
        }
        return create_function('$parameters','return call_user_func_array("Route::MakeHyperlink", _____($parameters));');
    }
    /*#*/
    public static function MakeHyperlink_IsController($value){
        return substr($value,0,1)===':';
    }
    /*#*/
    private static function MakeHyperlink_GetParameters($arguments){
        if(count($arguments)<2){
            return;
        }
        //--
        if($arguments[0]==='__SELF__'||$arguments[0]==='__DEFAULT__'){
            return $arguments[1];
        }
        elseif(self::MakeHyperlink_IsController($arguments[0])){
            return $arguments[1];
        }
        else{
            if(count($arguments)>=3){
                return $arguments[2];
            }
            else{
                return;
            }
        }
    }
    /*#*/
    private static function MakeHyperlink_GetParametersRevision($arguments){
        if(count($arguments)<3){
            return;
        }
        //--
        if($arguments[0]==='__SELF__'||$arguments[0]==='__DEFAULT__'){
            return $arguments[2];
        }
        elseif(self::MakeHyperlink_IsController($arguments[0])){
            return $arguments[2];
        }
        else{
            if(count($arguments)>=4){
                return $arguments[3];
            }
            else{
                return;
            }
        }
    }
    /*#*/
    private static function MakeHyperlink_GetAppliation($arguments){
        $firstArguments=trim($arguments[0]);
        if(strtoupper($firstArguments)==='__DEFAULT__'){           //明确指定应用名称为TryPHP配置的默认应用。
            return self::$DefaultApplication;
        }
        elseif(strtoupper($firstArguments)==='__SELF__'){          //明确指定应用名称为当前所在应用。
            return APP_NAME;
        }
        else{
            if(self::MakeHyperlink_IsController($firstArguments)){ //首个参数是控制器时则表明没有指定应用名称即返回当前应用名称。
                return APP_NAME;
            }
            else{
                return $firstArguments;                            //明确指定了具体的应用名称则直接返回。
            }
        }
    }
    /*#*/
    private static function MakeHyperlink_GetControllerAndModeAndMethod($arguments){
        $result=array('controller'=>NULL,'mode'=>NULL,'method'=>NULL);
        //--
        $firstArguments=trim($arguments[0]);
        if($firstArguments==='__SELF__'){
            $result['controller']=APP_CONTROLLER;
            $result['method']=APP_METHOD;
            if(APP_MODE!==Controller::MODE_CLASS){
                $result['mode']=APP_MODE;
            }
            return $result;
        }
        elseif($firstArguments==='__DEFAULT__'){
            $result['controller']=self::$DefaultController;
            $result['method']=self::$DefaultMethod;
            if(self::$DefaultMode!==Controller::MODE_CLASS){
                $result['mode']=self::$DefaultMode;
            }
            return $result;
        }
        elseif(self::MakeHyperlink_IsController($firstArguments)){
            $controllerArguments=substr($firstArguments,1,strlen($firstArguments));
        }
        else{
            if(isset($arguments[1])){
                $controllerArguments=trim($arguments[1]);
            }
            else{
                return NULL;
            }
        }
        //--
        if(strpos($controllerArguments,'::')!==FALSE){
            $temp=explode('::',$controllerArguments);
            $result['controller']=$temp[0];
            $result['method']=$temp[1];
        }
        else{
            $result['controller']=$controllerArguments;
        }
        //--
        if(strpos($result['controller'],'-')!==FALSE){
            $temp=explode('-',$result['controller']);
            $result['controller']=$temp[0];
            $result['mode']=$temp[1];
        }
        return $result;
    }
    /*#*/
    private static function MakeHyperlink_ForCommon($application,$controller,$mode,$method,$parameters,$parametersRevision){
        $hyperlink=sprintf('/?%s=%s',
            self::$ProtocolOptionsCommonParametersNameApplication,$application
        );
        //控制器。
        if(!is_null($controller)&&!empty($controller)){
            $hyperlink.=sprintf('&%s=%s',
                self::$ProtocolOptionsCommonParametersNameController,$controller
            );
        }
        //控制器模式。
        if(!is_null($mode)&&!empty($mode)){
            $hyperlink.=sprintf('&%s=%s',
                self::$ProtocolOptionsCommonParametersNameMode,$mode
            );
        }
        //控制器方法。
        if(!is_null($method)&&!empty($method)){
            $hyperlink.=sprintf('&%s=%s',
                self::$ProtocolOptionsCommonParametersNameMethod,$method
            );
        }
        //处理参数。
        if(!is_null($parameters)&&!empty($parameters)){
            $hyperlink.=('&'.self::MakeHyperlink_ProcessParameters($parameters,$parametersRevision));
        }
        return $hyperlink;
    }
    /*#*/
    private static function MakeHyperlink_ForStatic($application,$controller,$mode,$method,$parameters,$parametersRevision){
        $hyperlink='/'.$application;
        //控制器及其模式。
        if(!is_null($controller)&&!empty($controller)){
            $hyperlink.=('/'.$controller);
            if(!is_null($mode)&&!empty($mode)){
                $hyperlink.=('-'.$mode);
            }
        }
        //控制器方法。
        if(!is_null($method)&&!empty($method)){
            $hyperlink.=('/'.$method);
        }
        //处理参数。
        if(!is_null($parameters)&&!empty($parameters)){
            $hyperlink.=('/'.self::MakeHyperlink_ProcessParameters($parameters,$parametersRevision));
        }
        return $hyperlink;
    }
    /*#######
     * #
     */
    private static function MakeHyperlink_ProcessParameters($parameters,$parametersRevision){
        if(is_null($parameters)||empty($parameters)){
            return;
        }
        $string='';
        //--
        if(self::$Protocol===self::PROTOCOL_COMMON){
            $signPart='=';
            $signGlobal='&';
        }
        elseif(self::$Protocol===self::PROTOCOL_STATIC){
            $signPart='_';
            $signGlobal='/';
        }
        //--
        $parametersRevisionArray=$parametersRevision;
        if(gettype($parametersRevisionArray)==='array'){
            if(array_keys($parametersRevisionArray)===range(0,count($parametersRevisionArray)-1)){ //检查出不是关联数组。
                $parametersRevisionArray=self::MakeHyperlink_ProcessParametersRevision_ForArray($parametersRevision);
            }
        }
        else{
            $parametersRevisionArray=self::MakeHyperlink_ProcessParametersRevision_ForString($parametersRevision);
        }
        //--
        $parametersArray=$parameters;
        if(gettype($parameters)!=='array'){
            $parametersArray=explode('|',$parameters);
        }
        foreach($parametersArray as $key=>$value){
            if(array_keys($parametersArray)===range(0,count($parametersArray)-1)){ //检查出不是关联数组。
                $temp=explode(':',$value);
                $key=$temp[0];
                $value=$temp[1];
            }
            if(array_key_exists($key,$parametersRevisionArray)){
                $value=$parametersRevisionArray[$key];
            }
            //~
            if($key==='#'){
                $tempString=$key.$value;
            }
            else{
                $tempString=$key.$signPart.$value;
            }
            //~
            $string.=($tempString.$signGlobal);
        }
        $string=substr($string,0,strlen($string)-1);
        return $string;
    }
    /*#*/
    private static function MakeHyperlink_ProcessParametersRevision_ForString($parametersRevision){
        $parametersRevisionArray=array();
        if(!is_null($parametersRevision)&&!empty($parametersRevision)){
            $parametersRevisionArrayTemp=explode('|',$parametersRevision);
            foreach($parametersRevisionArrayTemp as $parameter){
                $temp=explode(':',$parameter);
                $key=$temp[0];
                $value=$temp[1];
                $parametersRevisionArray[$key]=$value;
            }
        }
        return $parametersRevisionArray;
    }
    /*#*/
    private static function MakeHyperlink_ProcessParametersRevision_ForArray($parametersRevision){
        $parametersRevisionArray=array();
        if(!is_null($parametersRevision)&&!empty($parametersRevision)){
            foreach($parametersRevision as $parameter){
                $temp=explode(':',$parameter);
                $key=$temp[0];
                $value=$temp[1];
                $parametersRevisionArray[$key]=$value;
            }
        }
        return $parametersRevisionArray;
    }

    /**
    * 描述：判定匹配并返回相应值。
    * @access public
    * @return string
    */
    public static function MatchedReturn($matchParameters,$returnValue,$addParameters=NULL){
        if($addParameters){
            $matchParameters.=('|'.$addParameters);
        }
        //--
        $isMatch=TRUE;
        //--
        $matchParametersArray=explode('|',$matchParameters);
        foreach($matchParametersArray as $parameter){
            $temp=explode(':',$parameter);
            $key=$temp[0];
            if(count($temp)>=2){
                $value=$temp[1];
            }
            if(!array_key_exists($key,self::$Arguments)||self::$Arguments[$key]!==$value){
                $isMatch=FALSE;
            }
        }
        //--
        if($isMatch){
            return $returnValue;
        }
    }

    /**
    * 描述：将数组参数转换为字符串格式。
    */
    public static function ArgumentsToString($arguments){
        if(gettype($arguments)!=='array'){
            return $arguments;
        }
        //--
        $result='';
        foreach($arguments as $key=>$value){
            $result.=($key.':'.urlencode($value).'|');
        }
        $result=substr($result,0,strlen($result)-1);
        return $result;
    }

    /**
    * 描述：导向406，应用不存在。
    */
    public static function Http406(){
        if(file_exists(TRYPHP_ERRORDOCUMENT_404)){
            include(TRYPHP_ERRORDOCUMENT_404);
        }
        header('HTTP/1.0 406 - Not Acceptable!');
    }

    /**
    * 描述：导向410，控制器文件不存在。
    */
    public static function Http410(){
        self::HttpFor404File();
        header('HTTP/1.0 410 - Gone!');
    }

    /**
    * 描述：导向412，错误的控制器模式。
    */
    public static function Http412(){
        self::HttpFor404File();
        header('HTTP/1.0 412 - Precondition Failed!~');
    }

    /**
    * 描述：导向415,不允许实例化虚拟控制器。
    */
    public static function Http415(){
        self::HttpFor404File();
        header('HTTP/1.0 415 - Unsupported Media Type!');
    }

    /**
    * 描述：导向416,控制器方法不存在。
    */
    public static function Http416(){
        self::HttpFor404File();
        header('HTTP/1.0 416 - Requested Range Not Satisfiable!');
    }

    /**
    * 描述：导向417，控制器类不存在。
    */
    public static function Http417(){
        self::HttpFor404File();
        header('HTTP/1.0 417 - Expectation Failed!');
    }

    /**
    * 描述：导向503，网站暂停。
    */
    public static function Http503(){
        self::HttpFor404File();
        header('HTTP/1.0 503 Not Found!');
    }

    /**
    * 描述：导向500页面，网站出错。
    */
    public static function Http500($httpCode=500){
        if(file_exists(APP_ROOT.'/'.TRYPHP_APPLICATIONINDENTURE_ERRORDOCUMENT_500)){
            include(APP_ROOT.'/'.TRYPHP_APPLICATIONINDENTURE_ERRORDOCUMENT_500);
        }
        elseif(file_exists(TRYPHP_ERRORDOCUMENT_500)){
            include(TRYPHP_ERRORDOCUMENT_500);
        }
        header('HTTP/1.0 '.$httpCode.' Internal Server Error!!');
    }

    /**
    * 描述：导向404页面,找不到页面。
    */
    public static function Http404($httpCode=404){
        self::HttpFor404File();
        header('HTTP/1.0 '.$httpCode.' Not found!');
    }

    /**
    * 描述：寻找包含404文件。
    */
    private static function HttpFor404File(){
        if(file_exists(APP_ROOT.'/'.TRYPHP_APPLICATIONINDENTURE_ERRORDOCUMENT_404)){
            include(APP_ROOT.'/'.TRYPHP_APPLICATIONINDENTURE_ERRORDOCUMENT_404);
        }
        elseif(file_exists(TRYPHP_ERRORDOCUMENT_404)){
            include(TRYPHP_ERRORDOCUMENT_404);
        }
    }
}